home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Graphics / Misc / Wood.0.72 / Sources / WoodDoc_SearchableText.m < prev    next >
Encoding:
Text File  |  1995-08-02  |  3.0 KB  |  120 lines

  1. #import "wooddoc.h"
  2.  
  3. @implementation WoodDoc (SearchableText)
  4.  
  5. - (oneway void)makeSelectionVisible
  6. {
  7.     NXRect scrollRect;
  8.     
  9.     if(lastSelectedNode){
  10.         [window disableFlushWindow];
  11.         [lastSelectedNode getBounds:&scrollRect];
  12.         [treeView scrollRectToVisible:&scrollRect];
  13.         [window reenableFlushWindow];
  14.         [window flushWindow];
  15.     }
  16. }
  17.  
  18. - (int)replaceAll:(const char *)pattern with:(const char *)replacement 
  19.   mode:(SearchMode)mode regexpr:(BOOL)regexpr cases:(BOOL)cases
  20. {
  21.     id searchTree, searchEndTree;
  22.     int result;
  23.  
  24.     switch(mode){
  25.         case SelStartToSelEnd:
  26.             if(lastSelectedNode){
  27.                 searchTree = lastSelectedNode;
  28.                 searchEndTree = [lastSelectedNode lastInDepth];
  29.             } else {
  30.                 searchTree = tree;
  31.                 searchEndTree = [tree lastInDepth];
  32.             }
  33.             break;
  34.         case TextEdgeToTextEdge:
  35.             searchTree = tree;
  36.             searchEndTree = [tree lastInDepth];
  37.             break;                            
  38.         default:
  39.             return SEARCH_INVALID_ARGUMENT;
  40.     }
  41.     result = 0;
  42.     [searchTree replaceTreeFor:pattern with:replacement untilNode:searchEndTree
  43.      regexpr:regexpr cases:cases result:&result];
  44.     if(result > 0)
  45.         [self updateViewsDirty:YES rect:NULL flag:(UPDATE_TREEVIEW | CHECK_RESIZE)]; 
  46.     return result;
  47. }
  48.                 
  49. - (oneway void)replaceSelection:(const char *)replacement
  50. {
  51.     if(lastSelectedNode){
  52.         if([lastSelectedNode replaceLabelSelectionWith:replacement pos:findPos size:findSize])
  53.             [self updateViewsDirty:YES rect:NULL flag:(UPDATE_TREEVIEW | CHECK_RESIZE)];
  54.     }
  55.     return;
  56. }
  57.  
  58. - (int)searchFor:(const char *)pattern mode:(SearchMode)mode 
  59.   reverse:(BOOL)rev regexpr:(BOOL)regexpr cases:(BOOL)cases position:(out int *)pos size:(out int *)size
  60. {
  61.     id searchTree, searchEndTree;
  62.     
  63.     findSelectedNode = nil;
  64.     findPos = 0; findSize = 0;
  65.     switch(mode){
  66.         case SelStartToSelEnd:
  67.             if(lastSelectedNode){
  68.                 searchTree = [lastSelectedNode previousInDepth];
  69.                 searchEndTree = [lastSelectedNode nextInDepth];
  70.             } else {
  71.                 searchTree = [tree previousInDepth];
  72.                 searchEndTree = tree;
  73.             }
  74.             break;
  75.         case SelEndToSelStart:
  76.             if(!lastSelectedNode){
  77.                 searchTree = tree;
  78.                 searchEndTree = [tree lastInDepth];
  79.             } else {
  80.                 searchTree = [lastSelectedNode nextInDepth]; 
  81.                 searchEndTree = [lastSelectedNode previousInDepth];
  82.             }
  83.             break;                            
  84.         default:
  85.             return SEARCH_INVALID_ARGUMENT;
  86.     }
  87.     findSelectedNode = [searchTree searchTreeFor:pattern untilNode:searchEndTree
  88.                         reverse:rev regexpr:regexpr cases:cases position:pos size:size];
  89.     if(findSelectedNode){
  90.         findPos = *pos;
  91.         findSize = *size;
  92.     } 
  93.     return (findSelectedNode == nil ? 0 : 1);
  94. }
  95.  
  96. - (oneway void)selectTextFrom:(int)start to:(int)end
  97. {    
  98.     if(findSelectedNode){
  99.         [self declareSelection:findSelectedNode];
  100.         [self updateViewsDirty:NO rect:NULL flag:UPDATE_TREEVIEW];
  101.         findSelectedNode = nil;
  102.     }
  103. }
  104.  
  105. - (void)writeSelectionToPasteboard:(in Pasteboard *)pboard asType:(in NXAtom)type;
  106. {
  107.     int len;
  108.     
  109.     if(lastSelectedNode){
  110.         len = strlen([lastSelectedNode label]);
  111.         if(len){
  112.               [pboard declareTypes:&type num:1 owner:NULL];
  113.               [pboard writeType:type data:[lastSelectedNode label] length:len];
  114.         }
  115.     }
  116. }
  117.  
  118. @end
  119.  
  120.